﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using Autofac;
using Autofac.Integration.Mvc;
using IBll;
using IDal;

namespace Bll
{
    public abstract class BaseBll<T>: IBaseBll<T> where T : class,new()
    {
        public IBaseDal<T> CurrentDal { get; set; }//为了适应“手写sql”开发模式下，将Dal基础的扩展操作全部放入Dal层，不再使用CurrentDal，而统一使用CurrentDalSession
        public abstract void SetCurrentDal();//抽象方法：要求子类必须实现

        /// <summary>
        /// 抽象父类的属性，从子类中无法属性注入，需要手动注入
        /// </summary>
        public IDalSession CurrentDalSession{get{return AutofacDependencyResolver.Current.ApplicationContainer.Resolve<IDalSession>();}}

        public BaseBll()
        {//父类的构造函数，会在子类创建对象时被调用
            SetCurrentDal();
        }

        #region 增加
        /// <summary>
        /// 增加（基础服务）
        /// </summary>
        /// <param name="entity"></param>
        public void Add(T entity)
        {
            CurrentDal.Add(entity);
        }
        #endregion

        #region 删除
        /// <summary>
        /// 删除（基础服务）
        /// </summary>
        public bool Delete(T entity)
        {
           return CurrentDal.Delete(entity);
        }
        #endregion

        #region 修改
        /// <summary>
        /// 修改（基础服务）
        /// </summary>
        public bool Update(T entity)
        {
            return CurrentDal.Update(entity);
        }
        #endregion

        #region 查询
        /// <summary>
        /// 主键查询（基础服务）
        /// </summary>
        public T Get(object id)
        {
            return CurrentDal.Get(id);
        }

        /// <summary>
        /// 查询所有（基础服务）
        /// </summary>
        public List<T> GetList()
        {
            return CurrentDal.GetList();
        }

        /// <summary>
        /// 分页查询（基础服务）
        /// </summary>
        public List<T> GetListByPage(int pageSize, int pageIndex, out int total)
        {
            string tableName= typeof (T).Name;
            string sql = "select * from " + tableName;

            return CurrentDal.GetListByPage(pageSize,pageIndex,out total,sql,"AddTime");
        }
        #endregion

    }
}
